#!/usr/bin/evn python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------
   文件名称 :     asynctask
   文件功能描述 :   功能描述
   创建人 :       小钟同学
   创建时间 :          2021/11/30
-------------------------------------------------
   修改描述-2021/11/30:         
-------------------------------------------------
"""
import threading
from typing import Callable

# 定义异步执行类的封装
class _Thread(threading.Thread):
    def __init__(self, func: Callable, daemon: bool, args, kwargs):
        super().__init__()
        # 相关的其他参数的设置
        self.__args = args
        self.__kwargs = kwargs
        # 需要被装饰执行的函数
        self.__func = func
        # 执行函数调用的返回结果
        self.res = None
        # 设置是否是守护进程
        self.setDaemon(daemon)
        # 默认是否只执行完成
        self.done = False

    def run(self) -> None:
        # 执行异步的处理函数回执结果
        self.res = self.__func(*self.__args, **self.__kwargs)
        self.done = True


class _Promise(object):
    '''
    封装关于限制对象的执行
    '''
    def __init__(self, thread: _Thread):
        self.__thread = thread
        self.__thread.start()

    # 获取当前对象执行的结果
    def get(self):
        self.__thread.join()
        return self.__thread.res

    # 当前执行的是否是守护进程
    @property
    def done(self):
        return self.__thread.done


# 线程执行异步任务
def task(daemon: bool = False):
    def decorator(func: Callable):
        def wrapper(*args, **kwargs) -> _Promise:
            return _Promise(_Thread(func, daemon, args, kwargs))
        return wrapper

    return decorator
